#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
GPIO 转换工具：将 GPIO1_A1 这类格式转换为 gpio1-1 和 pin 编号
适用于 RK3588 平台
"""

import re


def gpio_name_to_number(gpio_name):
    """
    将 GPIO 名称（如 GPIO1_A1）转换为 gpiox-N 和 pin 编号
    返回: (bank, offset, gpio_str, pin_num)
    """
    # 清理输入
    name = gpio_name.strip().upper()

    # 正则匹配 GPIOx_Yn 格式
    pattern = r"GPIO(\d+)_(\w)(\d+)"
    match = re.match(pattern, name)
    if not match:
        raise ValueError(f"无效的 GPIO 名称格式: {gpio_name}")

    bank = int(match.group(1))  # GPIO Bank
    group_char = match.group(2).upper()  # A/B/C/D
    num_in_group = int(match.group(3))   # 组内编号 0~7

    if num_in_group < 0 or num_in_group > 7:
        raise ValueError("组内编号必须是 0~7")

    # 字母转组号
    group_map = {'A': 0, 'B': 1, 'C': 2, 'D': 3}
    if group_char not in group_map:
        raise ValueError("组字母必须是 A/B/C/D")

    group_index = group_map[group_char]
    offset = group_index * 8 + num_in_group  # 计算在 Bank 内的偏移

    # 构造 gpiox-N 字符串
    gpio_str = f"gpio{bank}-{offset}"

    # 计算物理 pin 编号（假设每个 Bank 从 32*N 开始）
    pin_base_per_bank = 32
    pin_num = bank * pin_base_per_bank + offset

    return bank, offset, gpio_str, pin_num


def main():
    print("🔍 RK3588 GPIO 转换工具")
    print("支持格式示例：GPIO1_A1, GPIO1_B2, GPIO2_C3 等")
    print("输入 'quit' 退出\n")

    while True:
        user_input = input("请输入 GPIO 名称: ").strip()
        if user_input.lower() in ['quit', 'exit', 'q']:
            print("👋 退出程序")
            break
        try:
            bank, offset, gpio_str, pin_num = gpio_name_to_number(user_input)
            print(f"✅ 输入: {user_input.upper()}")
            print(f"   gpio{bank}-{offset} (用于 /sys/class/gpio/export)")
            print(f"   pin {pin_num} (物理引脚编号)\n")
        except Exception as e:
            print(f"❌ 错误: {e}\n")


if __name__ == "__main__":
    main()